﻿using NLog;

namespace Zwt.System.Host.Global
{
    /// <summary>
    /// 接口定义了一个用于主机生命周期管理的生命周期服务，它包含了两个方法： StopAsync  和  WaitForStartAsync 。
    /// 主机的启动和停止都是由  IHostLifetime  接口管理的，它会接收一个  CancellationToken ，并在主机停止时触发  StopAsync  方法。 
    /// </summary>
    public class MyHostLifetime : IHostLifetime
    {
        /// <summary>
        /// 日志接口
        /// </summary>
        private static Logger logger = LogManager.GetCurrentClassLogger();

        private readonly CancellationTokenSource _cancellationTokenSource;// 用于在主机启动之前停止应用程序执行。 
        private TaskCompletionSource<object> _delayStartTaskCompletionSource;// 我们使用  CancellationToken  和  Register  方法，将取消请求链接到  _delayStartTaskCompletionSource  实例上。

        public MyHostLifetime()
        {
            _cancellationTokenSource = new CancellationTokenSource();
        }

        public Task WaitForStartAsync(CancellationToken cancellationToken)
        {
            _delayStartTaskCompletionSource = new TaskCompletionSource<object>();
            cancellationToken.Register(() => _delayStartTaskCompletionSource.TrySetCanceled());
            return _delayStartTaskCompletionSource.Task;
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            if (_delayStartTaskCompletionSource != null)
            {
                _delayStartTaskCompletionSource.TrySetResult(null);
            }
            _cancellationTokenSource.Cancel();
            return Task.CompletedTask;
        }

        public Task ExecuteAsync(CancellationToken cancellationToken)
        {
            return Task.Run(() =>
            {
                // 主机启动后的操作
                Console.WriteLine("Host has started.");
                while (!_cancellationTokenSource.IsCancellationRequested)
                {
                    // 执行一些操作
                    Console.WriteLine("Host is running.");
                    Thread.Sleep(TimeSpan.FromSeconds(30));
                }
                Console.WriteLine("Host is stopping.");
            });
        }
    }
    //public  class MyHostLifetime : IHostApplicationLifetime
    //{
    //    /// <summary>
    //    /// 日志接口
    //    /// </summary>
    //    private static Logger logger = LogManager.GetCurrentClassLogger();

    //    public CancellationToken ApplicationStarted { get; }

    //    public CancellationToken ApplicationStopped { get; private set; }

    //    public CancellationToken ApplicationStopping { get; private set; }

    //    public void StopApplication()
    //    {
    //        //  在此处执行应用程序关闭前的一些清理操作
    //        logger.Warn("StopApplication");
    //    }
    //    public void StopApplication(CancellationToken cancellationToken)
    //    {
    //        ApplicationStopping = cancellationToken;
    //        // 在此订阅 ApplicationStopping 事件
    //        cancellationToken.Register(() =>
    //        {
    //            // 在应用程序将要关闭时执行清理操作
    //            logger.Warn("cancellationToken");
    //        });
    //    }
    //}
}
